package main

import (
	"encoding/json"
	"fmt"
	"io"
	"os"
	"strconv"
)

/*
学生信息系统添加，无限次数添加和查询，按q退出
1、添加学生信息

	判断此用户有没有添加过
	没有用户就提示输入学生信息（姓名，年龄，性别，住址）

2、查询学生信息

	按名字查询 判断输入的名字有没有添加过，有就输出信息，没有就提示没有添加过
	json map转换成json  字符串json转map 信息固化
*/

var stuinfo = make(map[string]map[string]string)
var file, _ = os.OpenFile("map/students.json", os.O_RDWR|os.O_CREATE, 0644)

func main() {
	var jsonData []byte
	jsonData, _ = io.ReadAll(file)
	json.Unmarshal(jsonData, &stuinfo)
	fmt.Println("map初始化：", stuinfo)
	var input string
	for {
		fmt.Println("请输入数字选择操作：")
		fmt.Println("1 - 添加学生信息")
		fmt.Println("2 - 查询学生信息")
		fmt.Println("q - 退出程序")
		fmt.Scanln(&input)
		if input == "1" {
			fmt.Println("正在进行添加操作")
			var stuName, stuGender, stuAddress string
			var stuAge int

			fmt.Print("请输入学生姓名: ")
			fmt.Scanln(&stuName)
			if !search(stuName) {
				fmt.Println("该同学已存在...")
				continue
			}
			fmt.Print("请输入学生年龄: ")
			fmt.Scanln(&stuAge)
			fmt.Print("请输入学生性别: ")
			fmt.Scanln(&stuGender)
			fmt.Print("请输入学生住址: ")
			fmt.Scanln(&stuAddress)
			add(stuName, stuGender, stuAddress, strconv.Itoa(stuAge))

			fmt.Println("学生信息已添加。")
		} else if input == "2" {
			fmt.Println("正在进行查询操作")
			var stuName string
			fmt.Print("请输入要查询的学生姓名: ")
			fmt.Scanln(&stuName)
			search(stuName)
		} else if input == "q" {
			// 清空文件内容
			if err := os.Truncate(file.Name(), 0); err != nil {
				fmt.Println("清空文件时发生错误:", err)
				return
			}
			// 移动文件指针到文件开头
			if _, err := file.Seek(0, io.SeekStart); err != nil {
				fmt.Println("移动文件指针时发生错误:", err)
				return
			}
			file.WriteString(getJsonData())
			fmt.Println("正在终止操作...")
			file.Close()
			break
		} else {
			fmt.Println("输入有误，请重新输入...")
		}
	}
}

// 新增学生信息
func add(name, gender, address, age string) {
	innerMap := make(map[string]string)
	innerMap["name"] = name
	innerMap["gender"] = gender
	innerMap["address"] = address
	innerMap["age"] = age
	stuinfo[name] = innerMap
}

func search(name string) bool {
	if info, exists := stuinfo[name]; exists {
		fmt.Println(info)
		return false
	} else {
		return true
	}
}

func getJsonData() string {
	jsonData, err := json.Marshal(stuinfo)
	if err != nil {
		fmt.Println("转换json格式错误:", err)
		return ""
	}
	fmt.Println(string(jsonData))
	return string(jsonData)
}
